package cn.cena.service.impl;

import cn.cena.constant.RedisConstant;
import cn.cena.domain.CourseType;
import cn.cena.mapper.CourseTypeMapper;
import cn.cena.service.ICourseTypeService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author yu
 * @since 2021-11-26
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {


    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private CourseTypeMapper courseTypeMapper;

    @Override
    // 自动删除redis中数据
    @CacheEvict(cacheNames = RedisConstant.PERFIX_COURSETYPE_TREE, key = RedisConstant.ALL_COURSETYPE_TREE)
    public boolean insert(CourseType entity) {
        boolean success = super.insert(entity);
        /*if (success){
            redisTemplate.delete(RedisConstant.ALL_COURSETYPE_TREE);
        }*/
        return success;
    }

    @Override
    // 自动删除redis中数据
    @CacheEvict(cacheNames = RedisConstant.PERFIX_COURSETYPE_TREE, key = RedisConstant.ALL_COURSETYPE_TREE)
    public boolean deleteById(Serializable id) {
        // 先删除数据库再删除Redis
        boolean success = super.deleteById(id);
      /*  if(success){
            redisTemplate.delete(RedisConstant.ALL_COURSETYPE_TREE);
        }*/
        return success;
    }

    @Override
    // 自动删除redis中数据
    @CacheEvict(cacheNames = RedisConstant.PERFIX_COURSETYPE_TREE, key = RedisConstant.ALL_COURSETYPE_TREE)
    public boolean updateById(CourseType entity) {
        boolean success = super.updateById(entity);
        /*if (success){
            redisTemplate.delete(RedisConstant.ALL_COURSETYPE_TREE);
        }*/
        return success;
    }

    /**
     * redis中查询树结构
     * @return
     */
    @Override
    // 自动存入redis注解
    @Cacheable(cacheNames = RedisConstant.PERFIX_COURSETYPE_TREE, key = RedisConstant.ALL_COURSETYPE_TREE)
    public List<CourseType> courseTree() {
        // 查询redis中是否有数据
        /*List<CourseType> courseTypes = (List<CourseType>)redisTemplate.opsForValue().get(RedisConstant.ALL_COURSETYPE_TREE);*/
       /* if (courseTypes != null){ // 有就直接返回
            return courseTypes;
        }

        // 没有就从数据库查询

        redisTemplate.opsForValue().set(RedisConstant.ALL_COURSETYPE_TREE, courseTypes);*/
        List<CourseType> courseTypes = listCourseTypeTree();
        return courseTypes;
    }

    /**
     * 根据id修改totalCount
     * @param i
     * @param courseTypeId
     */
    @Override
    public void updateTotalCountById(int i, String[] ids) {
        courseTypeMapper.updateTotalCountById(1,ids);
    }

    /**
     *  数据库中查询树结构
     * @return
     */
    public List<CourseType> listCourseTypeTree() {
        // 方式三代码优化
        List<CourseType> courseTypes = super.selectList(null);
        Map<Long, CourseType> allCourseTypeMap = courseTypes.stream().collect(Collectors.toMap(CourseType::getId, CourseType -> CourseType));

        // 找到所有的第一层
        List<CourseType> fistCourseTypes = new ArrayList<>();
        courseTypes.forEach(courseType->{
            // pid=0,就为第一级
            if (courseType.getPid() == null || courseType.getPid().longValue() == 0){
                fistCourseTypes.add(courseType);
            }else {
                CourseType parentType = allCourseTypeMap.get(courseType.getPid());
                if (parentType != null){
                    parentType.getChildren().add(courseType);
                }

            }
        });
        return fistCourseTypes;
    }

    /*@Override
    public List<CourseType> courseTree2() {
        // 方式一，mapper映射
        // return courseTypeMapper.courseTree();

        // 方式二，mapper嵌套查询
        //  return courseTypeMapper.courseTree(Long pid);
        // 方式三：代码
        List<CourseType> courseTypes = courseTypeMapper.selectList(null);
        // 找到所有的第一层
        List<CourseType> fistCourseTypes = new ArrayList<>();
        courseTypes.forEach(courseType->{
            // pid=0,就为第一级
            if (courseType.getId() == null || courseType.getId().longValue() == 0){
                fistCourseTypes.add(courseType);
            }else {
               for (CourseType parentType : courseTypes){
                   if(courseType.getPid().longValue() == parentType.getId().longValue()){ // 谁的id等于他的pid就是他的父级
                        parentType.getChildren().add(courseType);
                        break;
                   }
               }
            }
        });
        return fistCourseTypes;
    }*/
}
